package com.suhuamo.transtionals.controller;

import com.suhuamo.transtionals.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author yuanchuncheng
 * @slogan yscz
 * @date 2024-10-18
 * @description
 */
@RestController
public class TransactionController {

    @Autowired
    UserService userService;

    /**
     * 未做事务处理的异常演示——数据库成功写入
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/count")
    public int userCount() {
        return userService.count();
    }

    /**
     * 未做事务处理的异常演示——数据库成功写入
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo1.1")
    public void demo_1_1() {
        userService.demo_1_1();
    }


    /**
     * 带有事务的异常演示——数据库写入失败
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo1.2")
    public void demo_1_2() {
        userService.demo_1_2();
    }

    /**
     * RuntimeException、及RuntimeException以下的异常默认才会被事务捕获
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo2.1.1")
    public void demo_2_1_1() {
        userService.demo_2_1_1();
    }

    /**
     * RuntimeException、及RuntimeException以下的异常默认才会被事务捕获
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo2.1.2")
    public void demo_2_1_2() {
        userService.demo_2_1_2();
    }

    /**
     * RuntimeException、及RuntimeException以下的异常默认才会被事务捕获
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo2.1.3")
    public void demo_2_1_3() {
        userService.demo_2_1_3();
    }

    /**
     * RuntimeException以外的事务默认不会被捕获【Exception是RuntimeException的上层，也不会被捕获】
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo2.2.1")
    public void demo_2_2_1() throws Exception {
        userService.demo_2_2_1();
    }

    /**
     * RuntimeException以外的事务默认不会被捕获【Exception是RuntimeException的上层，也不会被捕获】
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo2.2.2")
    public void demo_2_2_2() throws Exception {
        userService.demo_2_2_2();
    }

    /**
     * RuntimeException以外的事务默认不会被捕获【Exception是RuntimeException的上层，也不会被捕获】
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo2.2.3")
    public void demo_2_2_3() throws Exception {
        userService.demo_2_2_3();
    }

    /**
     * 不同类使用事务--本类无事务
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo3.1.1")
    public void demo_3_1_1() throws Exception {
        userService.demo_3_1_1();
    }

    /**
     * 不同类使用事务--本类无事务
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo3.1.2")
    public void demo_3_1_2() throws Exception {
        userService.demo_3_1_2();
    }

    /**
     * 不同类使用事务--本类有事务
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo3.1.3")
    public void demo_3_1_3() throws Exception {
        userService.demo_3_1_3();
    }

    /**
     * 不同类使用事务--本类有事务
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo3.1.4")
    public void demo_3_1_4() throws Exception {
        userService.demo_3_1_4();
    }

    /**
     * 同一个类使用事务--本方法无事务
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo3.2.1")
    public void demo_3_2_1() throws Exception {
        userService.demo_3_2_1();
    }

    /**
     * 同一个类使用事务--本方法无事务
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo3.2.2")
    public void demo_3_2_2() throws Exception {
        userService.demo_3_2_2();
    }

    /**
     * 同一个类使用事务--本方法有事务
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo3.2.3")
    public void demo_3_2_3() throws Exception {
        userService.demo_3_2_3();
    }

    /**
     * 同一个类使用事务--本方法有事务
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo3.2.4")
    public void demo_3_2_4() throws Exception {
        userService.demo_3_2_4();
    }

    /**
     * 手动处理事务——手动回滚:代表我不想抛出异常，但是也想达到回滚的效果,
     * 事务控制的是整个方法，该方法会标记事务需要回滚，故不管在方法的哪个地方调用
     * setRollbackOnly(), 方法内的所有内容均会回滚
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo4.1")
    public void demo_4_1() throws Exception {
        userService.demo_4_1();
    }

    /**
     * 手动处理事务——指定部分回滚:代表我不想抛出异常，但是也想达到回滚的效果
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo4.2")
    public void demo_4_2() throws Exception {
        userService.demo_4_2();
    }

    /**
     * 手动处理事务——可以解决类内方法事务无法生效的问题
     * @param
     * @return void
     * @version 1.0
     * @author yuanchuncheng
     */
    @GetMapping("/demo4.3")
    public void demo_4_3() throws Exception {
        userService.demo_4_3();
    }
}
